import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';
import { RedisService } from '../redis/redis.service';
import Constants from '../common/constants';
import RoleEnum from './entities/RoleEnum';
import { SuperAdminForbiddenException } from '../exception/super-admin-forbidden.exception';
import { Role } from './entities/role.entity';
import { AdminForbiddenException } from '../exception/admin-forbidden.exception';

@Injectable()
export class RoleGuard implements CanActivate {
  constructor(
    private reflector: Reflector,
    private readonly redisService: RedisService,
  ) {}

  async canActivate(context: ExecutionContext) {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    // 权限注解没有添加权限，则允许请求允许每个请求继续进行
    if (!roles) {
      return true;
    }
    const request = context.switchToHttp().getRequest();
    const userInfo = await this.redisService.get(
      `${request.headers[Constants.Access_Token]}`,
    );
    if (!userInfo) {
      throw new AdminForbiddenException();
    }
    const user = JSON.parse(userInfo);

    // roles=[SuperAdmin,Admin],用户角色为SuperAdmin，可以访问

    // roles=[SuperAdmin,Admin],用户角色为Admin,不可以访问
    // roles=[SuperAdmin],用户角色为Admin.不可以访问

    // roles=[Admin],用户角色为Admin,可以访问

    // roles=[SuperAdmin],用户角色为SuperAdmin,可以访问

    // roles=[Admin],用户角色为SuperAdmin,可以访问
    // 总结：用户角色不是超级管理员并且需要角色的列表中包含超级管理员

    console.log(user.role, 'user.role');
    if (!user.role) {
      throw new AdminForbiddenException();
    }
    if (
      /**
       * 需要管理员或者超级管理员权限,但是用户角色不是管理员
       */
      user.role.roleName === RoleEnum.User
    ) {
      throw new AdminForbiddenException();
    } else if (
      /**
       * 需要超级管理员权限,但是用户角色不是超级管理员
       */
      user.role.roleName !== RoleEnum.SuperAdmin &&
      roles.includes(RoleEnum.SuperAdmin)
    ) {
      throw new SuperAdminForbiddenException();
    } else {
      return true;
    }
  }
}
